<!DOCTYPE html>
<html>
<head>
<style>
#placeItemsNormal {
  place-items: normal;
}
#placeItemsBaseline {
  place-items: baseline;
}
#placeItemsFirstBaseline {
  place-items: first baseline;
}
#placeItemsLastBaseline {
  place-items: last baseline;
}
#placeItemsStart {
  place-items: start;
}
#placeItemsFlexStart {
  place-items: flex-start;
}
#placeItemsEnd {
  place-items: end;
}
#placeItemsSelfStart {
  place-items: self-start;
}
#placeItemsStretch {
  place-items: stretch;
}
#placeItemsStartEnd {
  place-items: start end;
}
#placeItemsStartSelfEnd {
  place-items: start self-end;
}
#placeItemsStartBaseline {
  place-items: start baseline;
}

<!-- Invalid CSS cases -->
#placeItemsEmpty {
  place-items:;
}
#placeItemsAuto {
  place-items: auto;
}
#placeItemsCenterAuto {
  place-items: center auto;
}
#placeItemsNone {
  place-items: none;
}
#placeItemsSafe {
  place-items: safe;
}
#placeItemsStartSafe {
  place-items: start safe;
}
#placeItemsBaselineSafe {
  place-items: baseline safe;
}
#placeItemsStartEndLeft {
  place-items: start end left;
}
</style>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="resources/alignment-parsing-utils-th.js"></script>
</head>
<body>
  <p>Test to verify that the new place-items alignment shorthand is parsed as expected and correctly sets the longhand values.</p>
  <div id="log"></div>

  <div id="placeItemsNormal"></div>
  <div id="placeItemsBaseline"></div>
  <div id="placeItemsFirstBaseline"></div>
  <div id="placeItemsLastBaseline"></div>
  <div id="placeItemsStart"></div>
  <div id="placeItemsFlexStart"></div>
  <div id="placeItemsEnd"></div>
  <div id="placeItemsSelfStart"></div>
  <div id="placeItemsStretch"></div>
  <div id="placeItemsStartEnd"></div>
  <div id="placeItemsStartSelfEnd"></div>
  <div id="placeItemsStartBaseline"></div>

  <div id="placeItemsEmpty"></div>
  <div id="placeItemsAuto"></div>
  <div id="placeItemsCenterAuto"></div>
  <div id="placeItemsNone"></div>
  <div id="placeItemsSafe"></div>
  <div id="placeItemsStartSafe"></div>
  <div id="placeItemsBaselineSafe"></div>
  <div id="placeItemsStartEndLeft"></div>
<script>
function checkPlaceItemsValues(element, value, alignValue, justifyValue) {
  var res = value.split(" ");
  if (res.length < 2)
    res[1] = res[0];
  checkValues(element, "alignItems", "align-items", res[0], alignValue);
  checkValues(element, "justifyItems", "justify-items", res[1], justifyValue);
}

function checkPlaceItemsValuesJS(value, alignValue, justifyValue)
{
  element = document.createElement("div");
  document.body.appendChild(element);
  element.style.placeItems = value;
  if (alignValue == justifyValue)
    checkValues(element, "placeItems", "place-items", value, alignValue);
  else
    checkValues(element, "placeItems", "place-items", value, alignValue + ' ' + justifyValue);
  checkPlaceItemsValues(element, value, alignValue, justifyValue)
}

function checkPlaceItemsValuesBadJS(value)
{
  element.style.placeItems = "";
  element.style.placeItems = value;
  checkPlaceItemsValues(element, "", "normal", "normal")
}

test(function() {
  checkValues(placeItemsNormal, "placeItems", "place-items", "", "normal");
  checkPlaceItemsValues(placeItemsNormal, "", "normal", "normal");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'normal' value through CSS.");

test(function() {
  checkValues(placeItemsBaseline, "placeItems", "place-items", "", "baseline");
  checkPlaceItemsValues(placeItemsBaseline, "", "baseline", "baseline");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'baseline' value through CSS.");

test(function() {
  checkValues(placeItemsFirstBaseline, "placeItems", "place-items", "", "baseline");
  checkPlaceItemsValues(placeItemsFirstBaseline, "", "baseline", "baseline");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'first baseline' value through CSS.");

test(function() {
  checkValues(placeItemsLastBaseline, "placeItems", "place-items", "", "last baseline");
  checkPlaceItemsValues(placeItemsLastBaseline, "", "last baseline", "last baseline");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'last baseline' value through CSS.");

test(function() {
  checkValues(placeItemsStart, "placeItems", "place-items", "", "start");
  checkPlaceItemsValues(placeItemsStart, "", "start", "start");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'start' value through CSS.");

test(function() {
  checkValues(placeItemsFlexStart, "placeItems", "place-items", "", "flex-start");
  checkPlaceItemsValues(placeItemsFlexStart, "", "flex-start", "flex-start");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'flex-start' value through CSS.");

test(function() {
  checkValues(placeItemsEnd, "placeItems", "place-items", "", "end");
  checkPlaceItemsValues(placeItemsEnd, "", "end", "end");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'end' value through CSS.");

test(function() {
  checkValues(placeItemsSelfStart, "placeItems", "place-items", "", "self-start");
  checkPlaceItemsValues(placeItemsSelfStart, "", "self-start", "self-start");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'self-start' value through CSS.");

test(function() {
  checkValues(placeItemsStretch, "placeItems", "place-items", "", "stretch");
  checkPlaceItemsValues(placeItemsStretch, "", "stretch", "stretch");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'stretch' value through CSS.");

test(function() {
  checkValues(placeItemsStartEnd, "placeItems", "place-items", "", "start end");
  checkPlaceItemsValues(placeItemsStartEnd, "", "start", "end");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'start end' value through CSS.");

test(function() {
  checkValues(placeItemsStartSelfEnd, "placeItems", "place-items", "", "start self-end");
  checkPlaceItemsValues(placeItemsStartSelfEnd, "", "start", "self-end");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'start self-end' value through CSS.");

test(function() {
  checkValues(placeItemsStartBaseline, "placeItems", "place-items", "", "start baseline");
  checkPlaceItemsValues(placeItemsStartBaseline, "", "start", "baseline");
}, "Test getting the Computed Value of place-items's longhand properties when setting 'start baseline' value through CSS.");

test(function() {
  checkValues(placeItemsAuto, "placeItems", "place-items", "", "normal");
  checkPlaceItemsValues(placeItemsAuto, "", "normal", "normal");
}, "Test setting 'auto' as incorrect value through CSS.");

test(function() {
  checkValues(placeItemsCenterAuto, "placeItems", "place-items", "", "normal");
  checkPlaceItemsValues(placeItemsCenterAuto, "", "normal", "normal");
}, "Test setting 'center auto' as incorrect value through CSS.");

test(function() {
  checkValues(placeItemsNone, "placeItems", "place-items", "", "normal");
  checkPlaceItemsValues(placeItemsNone, "", "normal", "normal");
}, "Test setting 'none' as incorrect value through CSS.");

test(function() {
  checkValues(placeItemsSafe, "placeItems", "place-items", "", "normal");
  checkPlaceItemsValues(placeItemsSafe, "", "normal", "normal");
}, "Test setting 'safe' as incorrect value through CSS.");

test(function() {
  checkValues(placeItemsStartSafe, "placeItems", "place-items", "", "normal");
  checkPlaceItemsValues(placeItemsStartSafe, "", "normal", "normal");
}, "Test setting 'start safe' as incorrect value through CSS.");

test(function() {
  checkValues(placeItemsBaselineSafe, "placeItems", "place-items", "", "normal");
  checkPlaceItemsValues(placeItemsBaselineSafe, "", "normal", "normal");
}, "Test setting 'baseline safe' as incorrect value through CSS.");

test(function() {
  checkValues(placeItemsStartEndLeft, "placeItems", "place-items", "", "normal");
  checkPlaceItemsValues(placeItemsStartEndLeft, "", "normal", "normal");
}, "Test setting 'start end left' as incorrect value through CSS.");

test(function() {
  checkPlaceItemsValuesJS("center", "center", "center");
  checkPlaceItemsValuesJS("center start", "center", "start");
  checkPlaceItemsValuesJS("self-start end", "self-start", "end");
  checkPlaceItemsValuesJS("normal end", "normal", "end");
}, "Test setting values through JS.");

test(function() {
  checkPlaceItemsValuesBadJS("auto");
  checkPlaceItemsValuesBadJS("auto normal");
  checkPlaceItemsValuesBadJS("center auto");
  checkPlaceItemsValuesBadJS("legacy");
  checkPlaceItemsValuesBadJS("left legacy");
  checkPlaceItemsValuesBadJS("space-between");
  checkPlaceItemsValuesBadJS("center safe");
  checkPlaceItemsValuesBadJS("center self-start center");
  checkPlaceItemsValuesBadJS("asrt", "normal");
  checkPlaceItemsValuesBadJS("auto", "normal");
  checkPlaceItemsValuesBadJS("10px", "normal");
  checkPlaceItemsValuesBadJS("stretch safe");
  checkPlaceItemsValuesBadJS("self-start start end");
  checkPlaceItemsValuesBadJS("");
}, "Test setting incorrect values through JS.");

test(function() {
  element = document.createElement("div");
  document.body.appendChild(element);
  checkValues(element, "placeItems", "place-items", "", "normal");
  element.style.placeItems = "center";
  checkPlaceItemsValues(element, "center", "center", "center");
  element.style.placeItems = "initial";
  checkValues(element, "placeItems", "place-items", "initial", "normal");
  checkPlaceItemsValues(element, "initial", "normal", "normal");
}, "Test the 'initial' value of the place-items shorthand and its longhand properties' Computed value");

test(function() {
  document.body.style.placeItems = "start";
  var anotherElement = document.createElement("div");
  document.body.appendChild(anotherElement);
  checkPlaceItemsValues(anotherElement, "", "normal", "normal");
  anotherElement.style.placeItems = "inherit";
  checkPlaceItemsValues(anotherElement, "inherit", "start", "start");
}, "Test the 'inherit' value of the place-items shorthand and its longhand properties' Computed value");
</script>
</body>
</html>
